#include <iostream>
#include <cstdio>

using namespace std;

int n;
int total;
int num[100005] = {1};

int print(int t) {
    int p = num[1];
    int cross = 0;

    for (int i = 2; i <= t; i++) {
        cross += p * num[i];
        p += num[i];
    }
    cout << cross << endl;
}


void dfs(int s, int t) { //s是每一步拆分的数
    for (int i = num[t - 1]; i <= s; i++) {
        if (i < n) {    //当前数i要大于等于前1位数，且不超过n
            num[t] = i;
            s -= i;        //拆分后的s
            if (s == 0) {    //当拆分完了后我们打印记录的值
                print(t);
            } else {        //否则,我们继续递归
                dfs(s, t + 1);
            }
            s += i;        //回溯，加上拆分的数，以便产生所有可能产生的拆分
        }
    }
}

int main() {
    scanf("%d", &n);
    dfs(n, 1);
    printf("%d\n", total);
    return 0;
}
